package cn.neusoft.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    //代理工厂可以为任何类型生成代理  目标类只要实现了接口就可以
    Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy(){

       return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),  //类加载器
                target.getClass().getInterfaces(),   //接口数组（目标类实现的接口）
               /*
               调用处理器
               这是一个接口，代理对象的方法调用被转发到这个处理器的invoke方法（该方法有三个参数：代理对象、被调用的方法、方法参数）
                */
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        String methodName = method.getName();

                        if (methodName.contains("add") || methodName.contains("update") || methodName.contains("del")){
                            System.out.println("开启事务");
                            //method就是目标类要执行的业务方法  比如add  update
                            //对象.方法(参数)
                            try {
                                Object result = method.invoke(target, args);  //执行事务
                                System.out.println("提交事务");
                                return result;
                            }catch (Exception e){
                                e.printStackTrace();
                                System.out.println("回滚事务");
                                return null;
                            }finally {
                                System.out.println("关闭事务");
                            }
                        }else if(methodName.contains("get")){
                            System.out.println("开启事务");
                            //method就是目标类要执行的业务方法  比如add  update
                            //对象.方法(参数)
                            try {
                                Object result = method.invoke(target, args);
                                return result;
                            }catch (Exception e){
                                e.printStackTrace();
                                return null;
                            }finally {
                                System.out.println("关闭事务");
                            }
                        }else{
                            //不是业务方法   正常执行即可
                            return   method.invoke(target, args);
                        }

                    }
                }
        );

    }

}
